/** 
 * @file 2.模板2.cpp
 * @author 18-工程视觉-黄星照
 * @brief 阅读下列代码，简述下列代码原理
 *          (可选)a的类型
 *          (可选)代码复杂度
 * @date 2020-09-25
 */

/**
 * 
 * 编译期阶乘
 * 
 * a类型是factorial<N>中的匿名枚举体
 * 
 * 复杂度O(1)
 * 
 */
#include <iostream>
#include <string.h>
template<int N>
struct factorial
{
    enum
    {
        Value = N * factorial<N - 1>::Value
    };
};

template<>
struct factorial<1>
{
    enum
    {
        Value = 1
    };
};
int main(int argc, char **argv)
{
    auto a = factorial<5>::Value;
    ::std::cout << a << ::std::endl;
}